<?php
/**
 * Core_Acl_Resource_Abstract
 * 
 * @author naspeh
 * @version $Id: Abstract.php 659 2008-06-15 11:34:26Z naspeh $
 */
abstract class Core_Acl_Resource_Abstract implements Zend_Acl_Resource_Interface 
{
    /**
     * Связное поле в таблице ресурсов
     *
     * @var string
     */
    protected $_field = null;
    /**
     * Поле описания
     *
     * @var string
     */
    protected $_fieldDesc = 'desc';
    /**
     * Все привилегии
     *
     * @var array
     */
    protected $_allPrivileges = null;
    /**
     * Идентификатор ресурса
     *
     * @var string
     */
    protected $_resource_id;
    /**
     * Массив характеризующий ресурс
     *
     * @var array
     */
    protected $_row = null;
    /**
     * Конструктор
     *
     * @param Zend_Db_Table_Row_Abstract|array|string $row
     * @return void
     */
    public function __construct($row)
    {
        if ($row instanceof Zend_Db_Table_Row_Abstract) {
        	$row = $row->toArray();
        }
        $this->_row = $row;
        $tableResources = new Core_Table_Resources();
        $rowId = 0;
        if (null !== ($row = $tableResources->fetchRow(array($this->_field . ' = ?' => $this->id)))) {
        	$rowId = $row->id;
        }
        $this->_resource_id = $rowId;
    }
    /**
     * Возвращает индификатор ресурса
     *
     * @return string
     */
    public function getResourceId()
    {
        return $this->_resource_id;
    }   
    /**
     * Активирует ресурс в объекте Acl
     *
     * @param Core_Acl $acl
     * @return Core_Acl
     */
    public function active(Core_Acl & $acl)
    {
        if (!$acl->has($this)) {
            $acl->active($this->getResourceType());
            $acl->add($this, $this->getResourceType());
        }
        return $acl;
    }              
    /**
     * Возвращает значение параметра
     *
     * @param string $name
     * @return mixed
     */
    public function getRow($name = null)
    {
        $name = (string) $name;
        if (empty($name)) {
        	return $this->_row;
        } elseif (isset($this->_row[$name])) {
        	return $this->_row[$name];
        } else {
        	return null;
        }
    }
    /**
     * Возвращает значение параметра
     *
     * @param string $name
     * @return mixed
     */
    public function __get($name)
    {
        return $this->getRow((string)$name);
    }
    /**
     * Возвращает все привилегии
     *
     * @return array
     */
    public function getAllPrivileges()
    {
        if (is_null($this->_allPrivileges)) {
        	$this->setAllPrivileges();
        }
        return $this->_allPrivileges;
    }
    /**
     * Устанавливает все привилегии
     *
     * @return Core_Acl_Resource_Abstract
     */
    public function setAllPrivileges()
    {
        $typeResourceId = $this->getResourceType()->getResourceId();
        $tablePrivileges = new Core_Table_Privileges();
        $where = array(
            'resource_id in (?)' => array(array($typeResourceId, $this->getResourceId()))
        );
        $privileges = $tablePrivileges->fetchAll($where);
        $allPrivileges = array();
        foreach ($privileges as $privilege) {
            $allPrivileges[$privilege->name] = $privilege->toArray();
        }
        $this->_allPrivileges = $allPrivileges;
        return $this;
    }
    /**
     * Возвращает тип ресурса
     *
     * @return Core_Acl_Resource_Type
     */
    public function getResourceType()
    {
        $class = get_class($this);
        $tableResourceTypes = new Core_Table_ResourceTypes();
        if (null !== ($typeRow = $tableResourceTypes->fetchRow(array('name = ?' => $class)))) {
            $typeRow = $typeRow->toArray();
            $typeResource = new Core_Acl_Resource_Type($typeRow);
        } else {
        	throw new Core_Exception('typeResourceNotFound# ' . $class);
        }
        return $typeResource;
    }
    /**
     * Возвращает описание
     *
     * @return string
     */
    public function getDesc()
    {
        return $this->{$this->_fieldDesc};
    }
}